package cn.weli.svideo.baselib.utils;

import android.content.Context;
import android.view.View;
import android.view.inputmethod.InputMethodManager;

import java.lang.reflect.Field;

import cn.etouch.logger.Logger;

/**
 * 清除内存泄漏.
 *
 * @author Lei.Jiang
 * @version [1.0.0]
 * @see [相关类]
 * @since [1.0.0]
 */
public class CleanLeakUtils {

    /**
     * 解决InputMethodManager内存泄漏问题
     *
     * @param destContext 目标
     */
    public static void fixInputMethodManagerLeak(Context destContext) {
        try {
            if (destContext == null) {
                return;
            }
            InputMethodManager inputMethodManager = (InputMethodManager) destContext
                    .getSystemService(Context.INPUT_METHOD_SERVICE);
            if (inputMethodManager == null) {
                return;
            }

            String[] viewArray = new String[]{"mCurRootView", "mServedView", "mNextServedView",
                    "mLastSrvView"};
            Field filed;
            Object filedObject;

            for (String view : viewArray) {
                try {
                    filed = inputMethodManager.getClass().getDeclaredField(view);
                    if (!filed.isAccessible()) {
                        filed.setAccessible(true);
                    }
                    filedObject = filed.get(inputMethodManager);
                    if (filedObject != null && filedObject instanceof View) {
                        View fileView = (View) filedObject;
                        if (fileView.getContext() == destContext) { //
                            // 被InputMethodManager持有引用的context是想要目标销毁的
                            filed.set(inputMethodManager, null); // 置空，破坏掉path to gc节点
                        } else {
                            break;// 不是想要目标销毁的，即为又进了另一层界面了，不要处理，避免影响原逻辑,也就不用继续for循环了
                        }
                    }
                } catch (Throwable t) {
                    t.printStackTrace();
                }
            }
        } catch (Exception e) {
            Logger.e(e.getMessage());
        }
    }
}
